#pragma once 

#include "../../base/NonCopyable.h"
#include "EventLoop.h"
#include <thread>
#include <mutex>
#include<condition_variable>
#include<future>
/*异步编程​​的核心头文件，它提供了
一套高级工具来简化多线程任务的管理、线程间通信和结果同步*/


namespace tmms
{
    namespace network
    {
        //一个这个只运行一个EventLoop，就是一个线程运行一个事件循环
        //EventLoopThread保证跟EventLoop生命周期相同
        class EventLoopThread:public base::NonCopyable //一个EventLoopThread就是一个线程，就是一个EventLoop（而且他是自己创建的EventLoop），
        {
        public:
            EventLoopThread();
            ~EventLoopThread();

            std::thread & Thread();
            void Run();
            EventLoop * loop() const ;
        private:
            void StartEventLoop();
            EventLoop * loop_{nullptr};
            std::thread thread_;
            bool running_{false};
            std::mutex lock_;
            std::condition_variable condition_;
            std::once_flag once_;
            std::promise<int> promise_loop_;
        };
    }
}